package registnet.base;

import java.util.List;

/**
 * Defines an interface for plan of coursework implementations.
 */
public interface IPlanOfCourseWork {
	
	/**
	 * Returns the student number of the student associated with the plan of coursework.
	 * 
	 * @return the student number of the student associated with the plan of coursework
	 */
	public String getStudentNumber();
	
	/**
	 * Sets the student number of the student associated with the plan of coursework.
	 * 
	 * @param studentNumber
	 */
	public void setStudentNumber(String studentNumber);
	
	/**
	 * Returns the curriculum associated with the plan of coursework.
	 * 
	 * @return the curriculum associated with the plan of coursework
	 */
	public ICurriculum getCurriculum();
	
	/**
	 * Sets the curriculum associated with the plan of coursework.
	 * 
	 * @param curriculum
	 */
	public void setCurriculum(ICurriculum curriculum);
	
	/**
	 * Adds a course to the list of courses associated with the plan of coursework.
	 * 
	 * @param course
	 */
	public void addCourse(ICourse course);
	
	/**
	 * Returns the list of all courses associated with the plan of coursework.
	 * 
	 * @return the list of all courses associated with the plan of coursework.
	 */
	public List<ICourse> getAllCourses();
	
	/**
	 * Returns the list of all courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year and semester based on the curriculum.
	 * 
	 * @param year
	 * @param semester
	 * @return the list of all courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year and semester based on the curriculum
	 */
	public List<ICourse> getCourses(int year, int semester);
	
	/**
	 * Returns the list of all courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year based on the curriculum.
	 * 
	 * @param year the list of all courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year based on the curriculum.
	 * @return
	 */
	public List<ICourse> getCourses(int year);
	
	/**
	 * Returns the list of all courses associated with the plan of coursework 
	 * with the given type.
	 * 
	 * @param type
	 * @return the list of all courses associated with the plan of coursework 
	 * with the given type.
	 */
	public List<ICourse> getCourses(String type);
	
	/**
	 * Returns the list of all courses associated with the plan of coursework 
	 * with the GE type.
	 * 
	 * @param rgepDomain
	 * @return the list of all courses associated with the plan of coursework 
	 * with the GE type
	 */
	public List<ICourse> getGECourses(String rgepDomain);
	
	/**
	 * Returns the course associated with the plan of coursework with the given code.
	 * 
	 * @param courseCode
	 * @return the course associated with the plan of coursework with the given code
	 * and null if the course is not associated with the plan of coursework.
	 */
	public ICourse getCourse(String courseCode);
	
	/**
	 * Returns the list of all courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year and semester based on the curriculum
	 * and with the given type.
	 * 
	 * @param type
	 * @param year
	 * @param semester
	 * @return the list of all courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year and semester based on the curriculum
	 * and with the given type
	 */
	public List<ICourse> getCourses(String type, int year, int semester);
	
	/**
	 * Returns the list of all GE courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year and semester based on the curriculum
	 * and with the given RGEP domain.
	 * 
	 * @param rgepDomain
	 * @param year
	 * @param semester
	 * @return the list of all GE courses associated with the plan of coursework which 
	 * are supposed to be taken in the given year and semester based on the curriculum
	 * and with the given RGEP domain.
	 */
	public List<ICourse> getGECourses(String rgepDomain, int year, int semester);
	
	/**
	 * Checks if a course with the given code is in the list of courses is in the
	 * list of courses associated with the plan of coursework.
	 *  
	 * @param courseCode
	 * @return true if a course with the given code is in the list of courses is in the
	 * list of courses associated with the plan of coursework, and false otherwise.
	 */
	public boolean contains(String courseCode);
	
	/**
	 * Checks if the given course is in the list of courses is in the
	 * list of courses associated with the plan of coursework. 
	 * @param course
	 * @return if the given course is in the list of courses is in the
	 * list of courses associated with the plan of coursework, and null if not.
	 */
	public boolean contains(ICourse course);
	
}
